#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

const std::string nullfile = "/dev/null";

class Guard
{
public:
    void operator()(const std::string &path = "")
    {
        // 1.忽略其他信号
        signal(SIGCLD, SIG_IGN);
        signal(SIGPIPE, SIG_IGN);
        signal(SIGSTOP, SIG_IGN);

        // 2.将自己变成独立的会话
        if (fork() > 0)
        {
            exit(0); // 父进程退出
        }
        // child
        setsid();

        // 3.更改当前进程工作目录
        if(!path.empty())
            chdir(path.c_str());

        // 4.将标准输入、标准输出，标准错误重定向至/dev/null
        int fd = open(nullfile.c_str(), O_RDWR);
        if (fd > 0)
        {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
        }
        close(fd);
    }
};